#ifndef xpack_test_utils_bits_array
#define xpack_test_utils_bits_array
#pragma push_macro("xuser")
#undef  xuser
#define xuser mixc::test_utils_bits_array::inc
#include"test/helper.hpp" // 需要放第一
#include"utils/bits_array.hpp"
#pragma pop_macro("xuser")

namespace mixc::test_utils_bits_array{
    xtest("bits_array<16>"){
        // length=16, 1bit/item
        inc::bits_array<16> bits;
        inc::bits_array<16> bits_temp;

        xassert(bits->length, 16u);
        xassert(bits->bits_per_item, 1u);

        for(uxx i = 0; i < bits->length; i++){
            xassert_eq(bits[i], 0u);
        }

        for(uxx i = 0; i < ((1 << 16) - 1); i++){
            for(uxx j = 0; j < bits->length; j++){
                bits[j] = (i >> j) & 1;
                bits_temp[j] = bits[j];
            }

            for(uxx j = 0; j < bits->length; j++){
                uxx v = (i >> j) & 1;
                xassert_eq(bits[j], v, i, j);
                xassert_eq(bits_temp[j], v, i, j);
            }
        }

        bits[0] = 1;
        bits[1] = 0;
        bits[0].swap_value(bits[1]);
        xassert_eq(bits[0], 0u);
        xassert_eq(bits[1], 1u);

        bits.set_all();

        for(uxx i = 0; i < bits->length; i++){
            xassert_eq(bits[i], 1u);
        }

        bits.reset_all();

        for(uxx i = 0; i < bits->length; i++){
            xassert_eq(bits[i], 0u);
        }
    };

    xtest("bits_array<8, 2>"){
        // length=8, 2bit/item
        inc::bits_array<8, 2> bits;
        inc::bits_array<8, 2> bits_temp;

        xassert(bits->length, 8u);
        xassert(bits->bits_per_item, 2u);

        for(uxx i = 0; i < bits->length; i++){
            xassert_eq(bits[i], 0u);
        }

        for(uxx i = 0; i < ((1 << 16) - 1); i++){
            for(uxx j = 0; j < bits->length; j++){
                bits[j] = (i >> j) & 0x3;
                bits_temp[j] = bits[j];
            }

            for(uxx j = 0; j < bits->length; j++){
                uxx v = (i >> j) & 0x3;
                xassert_eq(bits[j], v, i, j);
                xassert_eq(bits_temp[j], v, i, j);
            }
        }

        for(uxx i = 0; i < 4; i++){
            bits.set_all(i);

            for(uxx j = 0; j < bits->length; j++){
                xassert_eq(bits[j], i);
            }

            bits.reset_all();

            for(uxx j = 0; j < bits->length; j++){
                xassert_eq(bits[j], 0);
            }
        }

        bits[0] = 3;
        bits[1] = 0;
        bits[0].swap_value(bits[1]);
        xassert_eq(bits[0], 0u);
        xassert_eq(bits[1], 3u);
    };
}

#endif
